package com.example.mybatisflexdemo.util;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.unit.DataSize;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

@Slf4j
@Component
public class FileUtils {

    // 配置文件中的最大文件大小
    @Value("${app.file.max-size:5MB}")
    private DataSize maxFileSize;

    /**
     * 将MultipartFile转换为字节数组
     */
    public byte[] multipartFileToBytes(MultipartFile avatarFile) {
        validateFile(avatarFile);
        try {
            return avatarFile.getBytes();
        } catch (IOException e) {
            log.error("Failed to convert file to bytes, filename: {}", avatarFile.getOriginalFilename(), e);
            throw new RuntimeException("文件读取失败: " + avatarFile.getOriginalFilename(), e);
        }
    }

    /**
     * 文件验证
     */
    private void validateFile(MultipartFile file) {
        if (file == null) {
            throw new IllegalArgumentException("文件不能为空");
        }
        if (file.isEmpty()) {
            throw new IllegalArgumentException("文件内容为空");
        }
        if (file.getSize() > maxFileSize.toBytes()) {
            throw new IllegalArgumentException("文件大小不能超过 " + maxFileSize);
        }
        // 可以添加文件类型验证
        String contentType = file.getContentType();
        if (!isAllowedContentType(contentType)) {
            throw new IllegalArgumentException("不支持的文件类型: " + contentType);
        }
    }

    private boolean isAllowedContentType(String contentType) {
        // 允许的MIME类型列表
        return contentType != null && contentType.startsWith("image/");
    }
}